#include <iostream>
#include <thread>
#include <chrono>
using namespace std;

void func(int num, string str)
{
    for (int i = 0; i < 10; ++i)
    {
        cout << "子线程: i = " << i << "num: " 
             << num << ", str: " << str << endl;
    }
}

void func1()
{
    for (int i = 0; i < 10; ++i)
    {
        cout << "子线程: i = " << i << endl;
    }
}

void foo()
{
    this_thread::sleep_for(std::chrono::seconds(1));
}
void foo1()
{
    this_thread::sleep_for(std::chrono::seconds(1));
}

int main()
{
    {
        cout << "主线程的线程ID: " << this_thread::get_id() << endl;
        thread t(func, 520, "i love you");
        thread t1(func1);
        cout << "线程t 的线程ID: " << t.get_id() << endl;
        cout << "线程t1的线程ID: " << t1.get_id() << endl;

        t.detach();
        t1.detach();
        // 让主线程休眠, 等待子线程执行完毕
        this_thread::sleep_for(chrono::seconds(1));
    }

    //在创建的子线程对象的时候，如果没有指定任务函数，那么子线程不会启动，主线程和这个子线程也不会进行连接
    thread t;
    cout << "before starting, joinable: " << t.joinable() << endl;

    t = thread(foo);
    //t = thread(foo1);  /error  构造函数④：使用=delete显示删除拷贝构造, 不允许线程对象之间的拷贝
    cout << "after starting, joinable: " << t.joinable() << endl;

    t.join();
    cout << "after joining, joinable: " << t.joinable() << endl;

    thread t1(foo);
    cout << "after starting, joinable: " << t1.joinable() << endl;
    t1.detach();
    cout << "after detaching, joinable: " << t1.joinable() << endl;

    
    thread t2(foo);
    //thread th1=t2;//error  构造函数④：使用=delete显示删除拷贝构造, 不允许线程对象之间的拷贝
    //thread th1(t2);//error
    //thread( thread&& other ) noexcept; 构造函数②：移动构造函数，将 other 的线程所有权转移给新的thread 对象。之后 other 不再表示执行线程。
    thread th1=std::move(t2);  
    //t2.join();  //error
    th1.join();
    //t2.join();  //error

    //thread线程类还提供了一个静态方法，用于获取当前计算机的CPU核心数，根据这个结果在程序中创建出数量相等的线程，每个线程独自占有一个CPU核心，这些线程就不用分时复用CPU时间片，此时程序的并发效率是最高的。
    int num = thread::hardware_concurrency();
    cout << "CPU number: " << num << endl;
}


/*
作者: 苏丙榅
链接: https://subingwen.cn/cpp/thread/
来源: 爱编程的大丙
著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。
*/